package persistence;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import model.*;
public class PersistenciaHabitacion {
	
	private static PersistenciaHabitacion instancia;
	
	public static PersistenciaHabitacion getInstancia()
	{
		if (instancia== null)
			instancia =new PersistenciaHabitacion();
		return instancia;
	}

	public Habitacion getHabitacion (Integer id) //HECHO
	{
		Habitacion h = null; 
		Connection con = PoolConexiones.getPoolConexiones().getConnection();
		
		try
		{
			String senten = "SELECT id, codigo, nombre, ocupacion_min, ocupacion_max "
					+ "FROM Habitacion "
					+ "WHERE id = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1,id);
			ResultSet result = ps.executeQuery();
			while (result.next())
			{						
				h = new Habitacion(
						result.getInt("id")
						, result.getString("codigo")
						, result.getString("nombre")
						, result.getInt("ocupacion_min")
						, result.getInt("ocupacion_max")
						);								
			}
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
			return h;
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Error al consultar Habitacion: " + e.getMessage());
				e.printStackTrace();
				PoolConexiones.getPoolConexiones().realeaseConnection(con);
	      }
	      return h;
	}
	
	public ArrayList<Habitacion> getHabitaciones(Integer id_hotel) //HECHO
	{		
		ArrayList<Habitacion> listaHabitaciones = new ArrayList<Habitacion>();
		Connection con = PoolConexiones.getPoolConexiones().getConnection();
		try
		{
			String senten = "SELECT id, codigo, nombre, ocupacion_min, ocupacion_max "
					+ "FROM Habitacion "
					+ "WHERE id_hotel = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1, id_hotel);
			ResultSet result = ps.executeQuery();
			while (result.next())
			{										
				listaHabitaciones.add(new Habitacion(
						result.getInt("id")
						, result.getString("codigo")
						, result.getString("nombre")
						, result.getInt("ocupacion_min")
						, result.getInt("ocupacion_max")
						)
				);
			}			
			
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
			return listaHabitaciones;
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Error al consultar Habitaciones" + e.getMessage());
				e.printStackTrace();
				PoolConexiones.getPoolConexiones().realeaseConnection(con);
	      }
	      return listaHabitaciones;
	}
	
	public void eliminarHabitaciones(int id_hotel)
	{
		Connection con = PoolConexiones.getPoolConexiones().getConnection();				
		try
		{
			String senten = "DELETE FROM Habitacion "
					+ "WHERE id_hotel = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1,id_hotel);	
			ps.executeUpdate();
			con.commit();
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Error al eliminar Habitaciones: " + e.getMessage());
				e.printStackTrace();
				try{
					if(con!=null)
			            con.rollback();
				}catch( SQLException e2){
					e2.printStackTrace();
				}
				PoolConexiones.getPoolConexiones().realeaseConnection(con);
	      }
	}
	
	public void eliminarHabitacion(Habitacion hab)
	{
		Connection con = PoolConexiones.getPoolConexiones().getConnection();				
		try
		{
			String senten = "DELETE FROM Habitacion "
					+ "WHERE id = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1,hab.getId());	
			ps.executeUpdate();
			con.commit();
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Error al eliminar Habitacion: " + e.getMessage());
				e.printStackTrace();
				try{
					if(con!=null)
			            con.rollback();
				}catch( SQLException e2){
					e2.printStackTrace();
				}
				PoolConexiones.getPoolConexiones().realeaseConnection(con);
	      }
	}
	
	public Habitacion insertHabitacion(Habitacion h, int id_hotel)
	{ 
		int newId=0;
		Connection con = PoolConexiones.getPoolConexiones().getConnection();
		try
		{			
			String senten = "INSERT INTO Habitacion "
					+ "(codigo, nombre, ocupacion_min, ocupacion_max, id_hotel) "
					+ "VALUES (?,?,?,?,?)";
			
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten, Statement.RETURN_GENERATED_KEYS);
			
			ps.setString(1, h.getCodigo());
			ps.setString(2, h.getNombre());
			ps.setInt(3, h.getOcupacionMin());
			ps.setInt(4, h.getOcupacionMax());
			ps.setInt(5, id_hotel);
						
			ps.execute();
			ResultSet  generatedKeys = ps.getGeneratedKeys();
			if(generatedKeys.next())
			{	
				newId = generatedKeys.getInt(1);
			}
			
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
			h.setId(newId);
			return h;
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Error al insertar Habitacion: " + e.getMessage());
				e.printStackTrace();
				PoolConexiones.getPoolConexiones().realeaseConnection(con);
				return h;
	      }	      
	}

	public Habitacion guardarHabitacion(Habitacion hab, int id_hotel) {
		Connection con = PoolConexiones.getPoolConexiones().getConnection();				
		try
		{
			String senten = "UPDATE Habitacion SET "
					+ "codigo = ?, "
					+ "nombre = ?, "
					+ "ocupacion_min = ?, "
					+ "ocupacion_max = ? "
					+ "WHERE id_hotel = ? AND id = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setString(1, hab.getCodigo());
			ps.setString(2, hab.getNombre());
			ps.setInt(3, hab.getOcupacionMin());
			ps.setInt(4, hab.getOcupacionMax());
			ps.setInt(5, id_hotel);
			ps.setInt(6, hab.getId());			
			ps.execute();
			
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Error al actualizar Habitacion: " + e.getMessage());
				e.printStackTrace();
				PoolConexiones.getPoolConexiones().realeaseConnection(con);
	      }
		return hab;
		
	}
	
}
